import Axios from "axios";
let errors = () => () => {};

/**
 * 通用get请求方法
 * @param {String} url 接口请求地址
 * @param {Function} callback 接口请求成功的回调
 * @param {Function} errorCallback 接口请求失败的回调
 */
export const axiosGet = (url, callback, errorCallback = errors()) => {
  return Axios.get(url)
    .then(res => {
      if (res.status === 200) {
        callback(res.data);
      } else {
        errorCallback(new Error(res.status));
      }
      return res;
    })
    .catch(err => {
      errorCallback(err);
    });
};

/**
 * 通用post请求方法
 * @param {String} url post请求地址
 * @param {Object} params 需要携带的参数
 * @param {Function} callback 请求成功的回调
 * @param {Function} errorCallback 请求失败的回调
 */
export const axiosPost = (url, params, callback, errorCallback = errors()) => {
  return Axios.post(url, params)
    .then(res => {
      callback(res.data);
      return res;
    })
    .catch(err => {
      errorCallback(err);
    });
};

/**
 * 通用统计请求方法
 * @param {String} url 统计地址
 * @param {FormData} data 统计参数
 */
export const axiosStatics = (url, data) => {
  return Axios({
    url,
    method: "post",
    headers: {
      "Content-Type": "multipart/form-data"
    },
    data
  })
    .then(res => {
      console.log("statics::::::" + JSON.stringify(res));
    })
    .catch(err => {
      console.log("staticserror::::::" + JSON.stringify(err));
    });
};

/**
 * jsonP跨域请求方法
 * @param {String} url 请求接口地址
 * @param {Function} callback 请求成功回调函数
 */
export const axiosJsonp = (url, callback) => {
  let callbackName =
    "callBack" +
    Math.random()
      .toString(36)
      .substr(2, 5);
  window[callbackName] = res => {
    if (res.code === 200) {
      callback(res);
    }
  };
  let script = document.createElement("script");
  script.src = url + "&returnType=jsonp&jsonpCallback=" + callbackName;
  document.body.appendChild(script);
  script.onload = script.onerror = () => {
    script.parentNode.removeChild(script);
    delete window[callbackName];
  };
};

export default {
  axiosGet,
  axiosPost,
  axiosStatics,
  axiosJsonp
};
